<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promise请求对象</title>
</head>
<body>
<script>

    /**
     * 状态的改变只有一次，当状态变为fulfilled或rejected状态后，就凝固不会再改变了，所以pending状态函数参数内多个resolve()或reject()也只会执行一个

     Promise.prototype.catch()方法是.then(null, rejection)或.then(undefined, rejection)的语法糖，用于指定发生错误时的回调函数，throw new Error(error)会被直接捕获

     若是Promise未设置reject函数，则抛出的错误会被一直向下链式传递，直到被捕获

     then函数会返回一个新的Promise对象，新Promise对象的状态变化仅由当前then执行时，是否有错误抛出且未被捕获决定

     未抛出或抛出但已被捕获则新Promise对象状态变为resolved状态，抛出且未被捕获则变为rejected状态

     而新Promise对象的resolve参数为当前then执行时的resolve或reject的返回值，reject的参数则为错误信息

     新Promise对象的状态或参数仅由返回出她的那个then决定

     若是resolve或reject返回了一个Promise对象，则当前then返回的新Promise对象的状态和参数与该Promise对象一致

     then或catch均可分开写多次，按顺序执行

     Promise.all()
     接收一个Promise数组，返回一个新Promise对象

     数组中所有的Promise状态都变成resolved时，返回的新Promise状态才会变成resolved，否则变成rejected

     新Promise对象的参数为全部触发成功时所有Promise的返回值的合集数组，顺序与Promise数组顺序相同

     或第一个触发失败的Promise的错误信息

     Promise.race()
     同样接收一个Promise数组，返回一个新Promise对象

     新Promise对象的状态和参数与第一个改变状态的Promise对象的状态和返回值或错误信息一致
     * */
    const newPromise = new Promise((resolve, reject) => {
        // 这里写pending阶段要做的事，是同步执行的
        // 具体写决定如何通向fulfilled或rejected状态，从而异步执行resolve(data)或reject(error)函数
        // resolve和reject均可接收一个参数，表示通向对应状态传递的数据
        console.log('resolve');
        resolve();
    });
    newPromise.then(
        (data) => {
            // 当newPromise的状态变成fulfilled后，该函数立即执行
            // 这里写通向fulfilled状态后要做的事情
            console.log('sss')
        },
        (error) => {
            // 当newPromise的状态变成rejected后，该函数立即执行
            // 这里写通向rejected状态后要做的事情
        }
    );

    //---------------
    function getData() {
        return new Promise((resolve, reject) => {});
    }

    getData().then(
        (data) => {},
        (error) => {}
    ).then(
        (data) => {},
        (error) => {}
    );
</script>
</body>
</html>